既存のECRリポジトリにライフサイクルポリシーを設定するためにcdkとawscliでためしたこと
はじめに
ECRリポジトリにアップしたDockerイメージを使ったデプロイ作業を継続して行っているうちに、蓄積されたイメージ数が100を超えていました。開発環境であるため再利用する可能性は低く、ライフサイクルポリシーでの上限管理にcdkによる設定を行おうとして若干の嵌りにあい、最終的にはawscliによる設定となりました。
awscliでの設定に用いたコマンドはもとより、cdkで設定しようとして試行錯誤した経過についてまとめました。
awscliによる実行
aws ecr put-lifecycle-policy
にて行います。--repository-name
は$(aws ecr describe-repositories | jq -r ".repositories[].repositoryName")
等指定するとよいでしょう。念の為、目的のリポジトリ名が出ることを確認してください。lifecycle-policy-text
は事前に用意したjsonファイルを指定します。
aws ecr put-lifecycle-policy \ --repository-name $(aws ecr describe-repositories | jq -r ".repositories[].repositoryName") \ --lifecycle-policy-text file://$(pwd)/lifecycle.json
lifecycle.json
{ "rules": [ { "rulePriority": 1, "description": "assets image limit", "selection": { "tagStatus": "any", "countType": "imageCountMoreThan", "countNumber": 10 }, "action": { "type": "expire" } } ] }
cdkでの試行錯誤
新規リポジトリの場合Repository
のInitializerを使うことになりますが、今回は既存リポジトリ。Arnを指定できるのはstaticメソッド経由での呼び出しに限られるため、いくつかあるうちfromRepositoryAttiributes
を指定しました。
const repos = Repository.fromRepositoryAttributes(this, 'Image Repos', { repositoryArn: <ARN> })
ここに一つ問題があります。Repository.fromRepositoryAttributes
から返るのはIRepository
です。IRepository
にはaddLifecycleRule()
のメソッドは有りません。
既存コードはDockerImageAssets
を使ってイメージのassetを作っており、そこからrepositoryを引いてみたものの、これもIRepository
となります。
あとがき
aws-ecr-assets
とaws-ecr
の違いについて余り意識したことがなかったのですが、実際に触ってみると中々思ったとおりには行かないものだと実感しました。無理に全てをcdkで行う必要もないため、「このコードを変更するのは骨が折れそうだ」と感じた場合には割り切ってAWSCLIを使うことが無難だと思います。